[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 3にて廃止される予定のDelayedInit
トレイトについて解説します。
DelayedInit
は廃止されます
DelayedInit
はニッチな用途にしか用いられず、そのわりにいろいろと予想外の挙動を招いていました。
そのため、サポートを続けるほどでもないと判断され、Scala 3からはサポートされなくなることが決定しました。
DelayedInit
はオブジェクトの初期化を実行時まで遅らせる機能
そもそもDelayedInit
トレイトは、主にApp
トレイトを実現するために使用されていました。
DelayedInit
トレイトを継承したクラスにおいては、DelayedInit
トレイトから継承したdelayedInit
メソッドが呼ばれるまで、メンバが初期化されない仕組みとなっていました。
App
トレイトを使用している箇所に注意
DelayedInit
トレイトが廃止された結果、DelayedInit
を使用していたApp
クラスが部分的に壊れてしまいました。
delayedInit
メソッドで実行されていたコードは、Scala 3以降はオブジェクトのイニシャライザで実行されるようになったためです。
一部のJVMにおいてはこのコードが解釈されるだけで実行されないことがあるので、2系と同様の挙動を保証できなくなったというわけです。
簡潔にメインプログラムを作成したいという目的においては引き続きApp
を使用することはできますが、ベンチマークなどの用途には使用しないようにしましょう。
また、コマンドライン引数にアクセスしたい場合は、main
メソッドを明示的に定義して使用しましょう。
object Hello { def main(args: Array[String]) = println(s"Hello, ${args(0)}") }
代替案は用意されていない
DelayedInit
の廃止に対する代替案はまだ用意されていません。
類似の機能が強く必要とされる場合には、本家にリクエストするとよいでしょう。
移行について
Scala 3.0にはDelayedInit
は実装されませんでした。
したがって、Scala 3.0へのアップデートの前に、DelayedInit
への依存を取り除く必要があります。